Міністерство освіти і науки, молоді та спорту України
Національний університет “Львівська політехніка”
Кафедра СКС
Курсовий проект
На тему:
“ Розробка та реалізація компонент системного програмного забезпечення ”
Львів 2012
Зміст
Завдання на курсовий прооект..........................................................................................3
Формальний опис вхіднрї мови програмування............................................................3
Розробка компілятора вхідної мови програмування.....................................................5
Розробка лексичного аналізатора................................................................................5
Розробка синтаксичного аналізатора..........................................................................6
Розробка семантичного аналізатора............................................................................6
Розробка оптимізатора коду..........................................................................................8
Розробка генератора коду..............................................................................................8
Відладка та тестування компілятора................................................................................9
Висновки...............................................................................................................................12
Література.............................................................................................................................13
Додаток А - Лістинг програми компілятора вхідної мови програмування...................14
Додаток Б - Лістинг тестових програм на вхідній мові програмування .......................32
1. Завдання на курсовий проект
Розробити компілятор заданої вхідної мови програмування, до якої висуваються наступні вимоги. Реалізувати три типи даних: логічний тип даних (boolean), знаковий цілочисельний тип та беззнаковий цілочисельний тип розміром 1 байт. Реалізувати можливість використання змінних з іменами довільної довжини. Реалізувати арифметичні операції: +, -, *, /, “-” (унарний мінус), відкриваюча: “(“ та закриваюча: “)” дужки та додаткову арифметичну операцію % (залишок від ділення). Реалізувати логічні операції: <, >, ==, != та додаткову логічну операцію ! (логічне “не”). Реалізувати наступні структури управління: оператор присвоєння, оператори блоку, оператор виводу, оператор виконання дії за умовою, оператор циклу while - do.
Цільова мова компілятора: асемблер (i86). Для отримання виконавчого файлу на виході розробленого компілятора скористатися програмами tasm.exe (компілятор мови асемблера) і tlink.exe (редактор зв’язків). Мова розробки компілятора: ANSI C або C++ (платформа win32). Реалізувати інтерфейс командного рядка. На вхід розробленого компілятора має подаватися текстовий файл, написаний на заданій мові програмування. На виході розробленого компілятора мають з’являтися чотири файли: файл з повідомленнями про помилки (або про їх відсутність), файл на мові асемблера, об’єктний та виконавчий файли.
2. Формальний опис вхідної мови програмування
Одною з перших задач, що виникають при побудові компілятора, є визначення вхідної мови програмування. Для цього використовують різні способи формального опису. В своїй курсовій роботі я використав розширену нотацію Бекуса-Наура (Backus/Naur Form - BNF).
Опис вхідної мови :
- три типи даних: логічний, беззнакове ціле, знакове ціле;- змінні довільної довжини;- арифметичні операції над цілими: +, -, *, /,%;- символи групування арифметичних операцій: “(”, “)”;- логічні операції над цілими: <, >, ==, !=;- логічна операція над логічними: !;- оператор присвоєння: “=” ;- оператори блоку: “{”, “}”;- оператор виконання дії за умовою: if-then-else;– оператор виводу print;- оператор циклу: while. Визначимо окремі термінальні символи та нерозривні набори термінальних символів (ключові слова):
{}...